/*
  Blah 数集
  题目描述
    大数学家高斯小时候偶然间发现一种有趣的自然数集合 Blah，对于以 a 为基的集合 Ba 定义如下：
      (1) a 是集合 Ba 的基，且 a 是 Ba 的第一个元素；
      (2) 如果 x 在集合 Ba 中，则 2x+1 和 3x+1 也都在集合 Ba 中；
      (3) 没有其他元素在集合 Ba 中了。
    现在小高斯想知道如果将集合 Ba 中元素按照升序排列，第 N 个元素会是多少？
  输入
    输入包括一行，包括两个数字，集合的基 a(1 ≤ a ≤ 50))以及所求元素序号 n(1 ≤ n ≤ 1000000)。
  输出
    对于每个输入，输出集合 Ba 的第 n 个元素值。
  样例输入
    1 7
  样例输出
    13
  提示
    样例解释，若基为 1，那么集合里面的数从小到大依次为: 1 3 4 7 9 10 13 ...
    自然数指的是非负整数。
*/

#include <bits/stdc++.h>

using namespace std;

int main() {
    long long n, m;
    queue <long long> q1;  // 最终生成的自然数集合
    queue <long long> q2;  // 存放 通过计算式 (2 * x + 1) 生成的值，后入队列的数总比先入队列数大
    queue <long long> q3;  // 存放 通过计算式 (3 * x + 1) 生成的值，后入队列的数总比先入队列数大

    cin >> n >> m;

    for (int i = 1; i <= m ; i++) {
        if (i == 1) {
            q2.push(n * 2 + 1);
            q3.push(n * 3 + 1);
            q1.push(n);
        } else {
            /*
              思路:
              a). 每次从之前生成的若干个数中, 找出其中最小的数 x,
              b). 并根据计算式得到 2 个新生成的值: 2 * x + 1, 3 * x + 1
              c). 将新生成的数放到 2 个有序队列中,
                    一个队列专门存放通过 2 * x + 1 计算式得到的数;
                    另外一个存放通过 3 * x + 1 计算式得到的数;
                  对于其中的任意一个队列来说, 先放入队列的数总比后放入队列的数要小!
                  那么, 我们每次找之前生成的数中的最小值的时候, 从这 2 个有序队列中找,
                    即直接比较这 2 个有序队列的最小值, 这 2 个数较小的值即为要找的值!
             */
            if (!q2.empty() && !q3.empty()) {
                long long v2 = q2.front();
                long long v3 = q3.front();
                if (v2 > v3) {
                    q2.push(v3 * 2 + 1);
                    q3.push(v3 * 3 + 1);
                    q3.pop();
                    q1.push(v3);
                } else {
                    q2.push(v2 * 2 + 1);
                    q3.push(v2 * 3 + 1);
                    q2.pop();
                    q1.push(v2);
                }
            } else {
                if (q2.empty()) {
                    long long  v3 = q3.front();
                    q2.push(v3 * 2 + 1);
                    q3.push(v3 * 2 + 1);
                    q3.pop();
                    q1.push(v3);
                } else {
                    long long v2 = q2.front();
                    q2.push(v2 * 2 + 1);
                    q3.push(v2 * 3 + 1);
                    q2.pop();
                    q1.push(v2);
                }
            }
        }
    }

    for (int i = 1; i <= m; i++) {
        if (i == m) {
            cout << q1.front();
        } else {
            q1.pop();
        }
    }

    return 0;
}